﻿using SqlSugar;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.Button;

namespace Supplement_data
{
    public partial class MainForm : Form
    {
        private static readonly string CONNStr = @"server={0};uid={1};pwd={2};database={3}";
        private List<string> ErrorTableList = new List<string>();
        private SqlSugarClient newDb;
        private List<string> selTable = new List<string>();
        private long SumCount = 0;
        private double SumTimes = 0;
        private string dtFormat = "yyyy/MM/dd HH:mm:ss";

        public MainForm()
        {
            InitializeComponent();
        }

        private void btnConn_Click(object sender, EventArgs e)
        {
            if (tbNewServerIp.Text == "")
            {
                MessageBox.Show("数据库服务器ip不能为空。");
                return;
            }
            if (tbNewUser.Text == "")
            {
                MessageBox.Show("数据库服务器用户名不能为空。");
                return;
            }
            if (tbNewPwd.Text == "")
            {
                MessageBox.Show("数据库服务器密码不能为空。");
                return;
            }
            if (cbbNewDB.Text == "")
            {
                MessageBox.Show("数据库名称不能为空。");
                return;
            }

            try
            {
                // 连接源数据库
                newDb = new SqlSugarClient(new ConnectionConfig
                {
                    ConnectionString = string.Format(CONNStr, tbNewServerIp.Text, tbNewUser.Text, tbNewPwd.Text, cbbNewDB.Text),
                    DbType = SqlSugar.DbType.SqlServer,
                    IsAutoCloseConnection = true,
                }, db =>
                {
                    db.Aop.OnLogExecuting = (sql, pars) =>
                    {
                        Console.WriteLine(UtilMethods.GetNativeSql(sql, pars));
                    };
                });
                if (!newDb.Ado.IsValidConnection())
                {
                    MessageBox.Show("目标数据库连接失败，请检查配置");
                    return;
                }
                MessageBox.Show("数据库连接成功。", "提示框");
                groupBox4.Enabled = true;
                panel1.Enabled = true;
                btnDisConn.Enabled = true;
                btnConn.Enabled = false;
                groupBox3.Enabled = false;
            }
            catch (Exception ex)
            {
                // 抛出异常
                MessageBox.Show(ex.Message);
            }
        }

        /// <summary>
        /// 补做历史数据
        /// </summary>
        /// <returns></returns>
        //private async Task SupplementHistoryAsync()
        //{
        //    // 遍历日期查询表名
        //    DateTime dt2 = dtpEnd1.Value;
        //    DateTime dt1 = dtpStart1.Value;
        //    string slotId = tb_slotId.Text.Trim();
        //    do
        //    {
        //        if (InvokeRequired)
        //        {
        //            Invoke(new Action(() =>
        //            {
        //                statusLabel.Text = string.Format("查询{0}的历史数据表。", dt2.ToString(dtFormat));
        //                tbMemo.AppendText(statusLabel.Text + "\r\n");
        //            }));
        //        }
        //        string dtFmt = dt2.ToString("yyyy") + (dt2.Month - 1) / 3 + 1;
        //        string sql = slotId == "" ? string.Format(@"select name from sys.tables where name like '%{0}'", dtFmt)
        //            : string.Format(@"select name from sys.tables where name = 'his_{0}{1}'", slotId, dtFmt);
        //        Console.WriteLine("-----------" + sql);
        //        List<string> tbList = await newDb.SqlQueryable<DbTableInfo>(sql).Select(it => it.Name).ToListAsync();
        //        //dt2 = dt2.AddDays(-1);
        //        if (tbList == null || tbList.Count == 0)
        //        {
        //            if (InvokeRequired)
        //            {
        //                Invoke(new Action(() =>
        //                {
        //                    statusLabel.Text = "没有历史数据表。";
        //                    tbMemo.AppendText(statusLabel.Text + "\r\n");
        //                }));
        //            }
        //            continue;
        //        }
        //        // 遍历表
        //        foreach (string tb in tbList)
        //        {
        //            try
        //            {
        //                if (InvokeRequired)
        //                {
        //                    Invoke(new Action(() =>
        //                    {
        //                        statusLabel.Text = "开始历史数据表[" + tb + "]的数据迁移...";
        //                        tbMemo.AppendText("查询" + tb + "的历史数据...\r\n");
        //                    }));
        //                }
        //                DateTime tStart = DateTime.Now;
        //                // 查询历史数据
        //                List<HistoryData> list = await newDb.Queryable<HistoryData>().AS(tb).OrderBy(it => it.Record_time).ToListAsync();
        //                if (list == null || list.Count == 0)
        //                {
        //                    if (InvokeRequired)
        //                    {
        //                        Invoke(new Action(() =>
        //                        {
        //                            tbMemo.AppendText(string.Format("历史数据表[{0}]没有数据...\r\n", tb));
        //                        }));
        //                    }
        //                    continue;
        //                }
        //                // 判断目标数据表是否存在
        //                bool tbExist = newDb.DbMaintenance.IsAnyTable(tb);
        //                // 开启事务
        //                newDb.Ado.BeginTran();
        //                // 将老数据映射到新数据
        //                var newList = list;
        //                if (tbExist)
        //                {
        //                    // 如果表存在，删除对应时间段的数据
        //                    newDb.Deleteable<HistoryData>().AS(tb).Where(it => SqlFunc.Between(it.Record_time, dt, dt)).ExecuteCommand();
        //                    if (InvokeRequired)
        //                    {
        //                        Invoke(new Action(() =>
        //                        {
        //                            statusLabel.Text = string.Format("删除历史数据表[{0}]--{1}的数据。", tb, dt.ToString(dtFormat));
        //                            tbMemo.AppendText(statusLabel.Text + "\r\n");
        //                        }));
        //                    }
        //                }
        //                else
        //                {
        //                    // 如果表不存在，创建表
        //                    newDb.CodeFirst.As<HistoryData>(tb).InitTables<HistoryData>();
        //                    if (InvokeRequired)
        //                    {
        //                        Invoke(new Action(() =>
        //                        {
        //                            statusLabel.Text = string.Format("创建历史数据表[{0}]。", tb);
        //                            tbMemo.AppendText(statusLabel.Text + "\r\n");
        //                        }));
        //                    }
        //                }
        //                if (InvokeRequired)
        //                {
        //                    Invoke(new Action(() =>
        //                    {
        //                        tbMemo.AppendText("开始补做历史数据...\r\n");
        //                    }));
        //                }
        //                // 将数据插入到目标数据库
        //                int count = newDb.Fastest<HistoryData>().AS(tb).PageSize(2000).BulkCopyAsync(newList).Result;
        //                //int count = newDb.Insertable(newList).AS(newTB).ExecuteCommand();
        //                // 提交事务
        //                newDb.Ado.CommitTran();
        //                // 计算耗时
        //                TimeSpan span = (TimeSpan)(DateTime.Now - tStart);
        //                double seconds = (double)(Math.Round(span.TotalSeconds * 1000)) / 1000;
        //                SumTimes += seconds;
        //                if (InvokeRequired)
        //                {
        //                    Invoke(new Action(() =>
        //                    {
        //                        statusLabel.Text = string.Format("[{0}]的历史数据迁移完成，共：{1}条数据。耗时：{2}秒", tb, count, seconds);
        //                        tbMemo.AppendText(statusLabel.Text + "\r\n");
        //                    }));
        //                }
        //                SumCount += count;
        //            }
        //            catch (Exception ex)
        //            {
        //                if (InvokeRequired)
        //                {
        //                    Invoke(new Action(() =>
        //                    {
        //                        statusLabel.Text = string.Format("[{0}]的历史数据迁移失败，正在回滚...", tb);
        //                        tbMemo.AppendText(string.Format("[{0}]的历史数据迁移失败，原因：{1}\r\n", tb, ex.Message));
        //                    }));
        //                }
        //                // 回滚事务
        //                newDb.Ado.RollbackTran();
        //                ErrorTableList.Add(tb);
        //                continue;
        //            }
        //        }
        //        dt2 = dt2.AddDays(-1);
        //    } while (dt1 <= dt2);
        //}

        private void btnDisConn_Click(object sender, EventArgs e)
        {
            newDb?.Close();
            groupBox4.Enabled = false;
            panel1.Enabled = false;
            btnConn.Enabled = true;
            btnDisConn.Enabled = false;
            groupBox3.Enabled = true;
        }

        private void btnDataMigration_Click(object sender, EventArgs e)
        {
            if (selTable == null || selTable.Count == 0)
            {
                MessageBox.Show("请先选择需要补做的数据");
                return;
            }
            DialogResult res = MessageBox.Show("补做数据会删除目标时间范围内的相关表的数据，\r\n确定开始补做数据吗？", "确认框", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
            if (res != DialogResult.OK)
            {
                return;
            }
            btnDataMigration.Enabled = false;
            groupBox1.Enabled = false;
            groupBox4.Enabled = false;

            // 创建线程
            //Task.Factory.StartNew(async () =>
            //{
            //    foreach (string item in selTable)
            //    {
            //if (item == TableConstant.hourRpt)
            //{
            //    // 迁移小时报数据
            //    await MigrateDataAsync("小时报");
            //}
            //else if (item == TableConstant.shiftRpt)
            //{
            //    // 迁移班报数据
            //    await MigrateDataAsync("班报");
            //}
            //else if (item == TableConstant.dayRpt)
            //{
            //    // 迁移日报数据
            //    await MigrateDataAsync("日报");
            //}
            //else if (item == TableConstant.processData)
            //{
            //    // 迁移工艺数据
            //    await MigrateDataAsync("工艺");
            //}
            //else if (item == TableConstant.effectData)
            //{
            //    // 迁移效应记录数据
            //    await MigrateDataAsync("效应记录");
            //}
            //else if (item == TableConstant.faultData)
            //{
            //    // 迁移故障记录数据
            //    await MigrateDataAsync("故障记录");
            //}
            //else if (item == TableConstant.operateData)
            //{
            //    // 迁移人工操作记录数据
            //    await MigrateDataAsync("人工操作记录");
            //}
            //else if (item == TableConstant.paramChangeData)
            //{
            //    // 迁移参数修改记录数据
            //    await MigrateDataAsync("参数修改记录");
            //}
            //else
            //if (item == TableConstant.historyData)
            //{
            //    // 补做历史数据
            //    await SupplementHistoryAsync();
            //}
        }

        //    statusLabel.Text = string.Format("补做数据完成，共：{0}条数据。耗时：{1}", SumCount, DateTimeUtils.SecondToTime(SumTimes));
        //    tbMemo.AppendText(statusLabel.Text + "\r\n");
        //});

        //btnDataMigration.Enabled = true;
        //groupBox1.Enabled = true;
        //groupBox4.Enabled = true;
        //}
    }
}